package cn.edu.flying_birds;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Timer;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.TimerTask;

/**
 * @PackageName: cn.edu.flying_birds
 * @ClassName: BirdPanel
 * @Description: 游戏面板类：画小鸟、画背景、柱子，地面、积分系统
 * @author: RZS
 * @date: 2021/6/21  15:42
 */
public class BirdPanel extends JPanel {

    // 定义存放背景图片的变量
    private BufferedImage bj;
    // 定义地面类变量
    private Ground ground;
    // 定义定时器变量
    private Timer timer;
    // 定义第一根柱子对象
    private Column column1;
    // 定义第二根柱子对象
    private Column column2;
    // 定义小鸟对象
    private Bird bird;
    // 定义游戏运行状态 false 为未运行，true为运行状态
    private boolean status;
    // 定义游戏是否结束状态，false为未结束，true为结束
    private boolean gameOver;
    // 定义分数
    private int score;

    public BirdPanel() {
        try {
            init();
        } catch (IOException e) {
            System.out.println("初始化面板失败");
            e.printStackTrace();
        }
        // 添加鼠标监听
        MouseAdapter mouseAdapter = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // System.err.println("鼠标点击了");
                // 判断游戏运行状态
                if(status){
                    // 判断游戏是否结束
                    if(gameOver){
                        // 初始化游戏，重返18岁
                        timer.cancel();// 关闭定时器
                        try {
                            init();
                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }
                        // 重画游戏界面
                        repaint();
                    }else{
                        // 判断小鸟是否飞到顶部
                        if(bird.y > 0){
                            // 调用小鸟往上飞的方法
                            bird.moveUp();
                        }
                    }


                }else{
                    // 将游戏状态修改为true，同时调用run()
                    run();
                    status = true;
                }
            }
        };

        this.addMouseListener(mouseAdapter);
    }

    //初始化面板
    private void init() throws IOException {
        // 设置背景颜色
        setBackground(Color.black);
        // 读取背景图片
        bj = ImgUtils.getImg("../img/bg.png");
        // 初始化地面变量
        ground = new Ground();
        // 初始第一根化柱子变量
        column1 = new Column(1);
        // 初始第二根化柱子变量
        column2 = new Column(2);
        // 初始化小鸟
        bird = new Bird();
        status = false;
        gameOver = false;
        score = 0;
    }

    /**
     * 执行方法：
     *      让小鸟飞起来，地面动起来，柱子动起来
     */
    public void run(){
        // 初始化定时器对象
        timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                // 判断游戏是否结束，如果游戏结束了，则不执行以下代码，否则执行
                if(!gameOver && status){
                    // 调用地面移动的方法
                    ground.move();
                    // 调用柱子移动的方法
                    column1.move();
                    column2.move();
                    // 调用小鸟飞
                    bird.flying();
                    // 判断第一根柱子是否与小鸟相撞
                    boolean b1 = bird.columnCrash(column1);
                    // 判断第二根柱子是否与小鸟相撞
                    boolean b2 = bird.columnCrash(column2);

                    // 判断小鸟是否与地面相撞
                    if(bird.groundCrash() || b1 || b2){
                        // 与地面相撞，修改游戏结束状态
                        gameOver = true;
                    }else{
                        // 调用小鸟往下落的方法
                        bird.moveDown();
                    }

                    // 计分
                    if(bird.x == (column1.x+column1.width) || bird.x == (column2.x+column2.width)){
                        score++;
                    }

                }


                // 刷新游戏界面
                repaint();
            }
        };

        // 开启定时器
        timer.schedule(task, 0, 30);// 30ms  每隔30毫秒执行一次
    }

    /**
     * 画内容，画对象
     * @param g 画笔
     */
    @Override
    public void paint(Graphics g) {
        // 绘制背景图片
        g.drawImage(bj, 0, 0, null);
        // 绘制柱子图片
        g.drawImage(column1.img, column1.x, column1.y, column1.width, column1.height, null);
        g.drawImage(column2.img, column2.x, column2.y, column2.width, column2.height, null);
        // 绘制小鸟图片
        g.drawImage(bird.img, bird.x, bird.y, bird.width, bird.height, null);
        try {
            // 绘制游戏初始界面
            if (!status) {
                g.drawImage(ImgUtils.getImg("../img/start.png"), 0, 0, null);
            }
            // 绘制游戏结束页面
            if (gameOver) {
                g.drawImage(ImgUtils.getImg("../img/gameover.png"), 0, 0, null);
            }
        }catch (IOException e){
            e.printStackTrace();
        }

        // 绘制分数
        g.setColor(Color.white);
        g.setFont(new Font("黑体", Font.BOLD, 20));
        g.drawString("分数："+score, 15, 30);

        // 绘制地面图片
        g.drawImage(ground.img, ground.x, ground.y, null);


    }
}
